import datetime

from django.utils.deprecation import MiddlewareMixin
from django.shortcuts import redirect
from web import models
from projectmanager import settings


class LoginUser:
    def __init__(self):
        self.user = None  # 登录用户
        self.price_policy = None  # 登录用户的价格策略
        self.project = None  # 登录用户的项目列表


class AuthMiddleWare(MiddlewareMixin):
    def process_request(self, request):
        """ 如果用户已登录，则request中赋值 """
        request.login_user = LoginUser()
        user_id = request.session.get('user_id', 0)
        user_object = models.UserInfo.objects.filter(id=user_id).first()
        request.login_user.user = user_object

        # 白名单 没有登录可以访问的页面
        """
        1 获取当前用户访问的URL
        2 检查URL是否在白名单中,如果在则继续向后访问，如果不在则进行判断是否已登录
        """
        if request.path_info in settings.WHITE_REGEX_URL_LIST:
            return
        # 检查用户是否已登录，如果已登录放行，没有登录返回到login视图
        if not request.login_user.user:
            return redirect('login')

        # 登录成功之后，访问后台管理时：获取当前用户所拥有的额度
        # 方式一： 免费额度在交易记录中存储
        # 获取当前用户ID值最大（最近交易记录）
        _object = models.Transaction.objects.filter(user=user_object, status=2).order_by('-id').first()
        # 判断是否已过期
        current_datetime = datetime.datetime.now()
        if _object.end_datetime and _object.end_datetime < current_datetime:
            _object = models.Transaction.objects.filter(user=user_object, status=2, price_policy__category=1).first()
        request.login_user.price_policy = _object.price_policy

        # 方式二: 免费的额度存储配置文件

        """
        到目前为止
        request.login_user对象已经封装了三个属性
        1-用户对象
        2-用户价格策略对象
        3-用户创建的项目对象
        """

    def process_view(self, request, view, args, kwargs):
        """ 限制访问项目详细信息的规则 """
        """
        1 匹配路由，如果路由是以/manage/开头的，说明是访问的项目详细信息，如果不是那么直接跳过
        2 获取url请求中的project_id ，通过project_id的值判断这个项目是否属于登录的用户，如果是登录的用户创建的，或者是登录用户参与的都可以
        3 将当前访问的项目，保存到login_user对象中的project对象中
        """
        #print(request.path_info) #/manage/1/dashboard/
        if not request.path_info.startswith('/manage/'): # 获取url
            return

        project_id = kwargs.get('project_id') # 获取url中的project_id
        #print(kwargs) #{'project_id': '1'}

        create_project = models.Project.objects.filter(creator=request.login_user.user, id=project_id).first()
        if create_project:
            request.login_user.project = create_project
            return
        join_project = models.ProjectUser.objects.filter(user=request.login_user.user, project_id=project_id).first()
        if join_project:
            request.login_user.project = join_project.project
            return

        return redirect('project_list')
